package com.wl.designpattern.decorator;

/**
 * 装饰者模式
 * 动态地给一个对象添加一些额外的职责。就增加功能来说，装饰模式相比生成子类更为灵活。
 *
 * Component（抽象组件）：接口或者抽象类，被装饰的最原始的对象。具体组件与抽象装饰角色的父类。
 * ConcreteComponent（具体组件）：实现抽象组件的接口。
 * Decorator（抽象装饰角色）：一般是抽象类，抽象组件的子类，同时持有一个被装饰者的引用，用来调用被装饰者的方法;同时可以给被装饰者增加新的职责。
 * ConcreteDecorator（具体装饰类）：抽象装饰角色的具体实现。
 *
 * 应用场景
 * 需要扩展一个类的功能，或给一个类增加附加功能时
 * 需要动态的给一个对象增加功能，这些功能可以再动态的撤销
 * 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
 *
 * 优点
 * 采用组合的方式，可以动态的扩展功能，同时也可以在运行时选择不同的装饰器，来实现不同的功能。
 * 有效避免了使用继承的方式扩展对象功能而带来的灵活性差，子类无限制扩张的问题。
 * 被装饰者与装饰者解偶，被装饰者可以不知道装饰者的存在，同时新增功能时原有代码也无需改变，符合开放封闭原则。
 *
 * 缺点
 * 装饰层过多的话，维护起来比较困难。
 * 如果要修改抽象组件这个基类的话，后面的一些子类可能也需跟着修改，较容易出错。
 *
 * android 应用
 * Context ContextImpl ContextWrapper 就是装饰者模式
 *
 * Created by wangliang on 2021/2/27.
 */
public class Test {
    public static void main(String[] args) {
        Room newRoom = new NewRoom();//有一间新房间
        RoomDecorator bedroom = new BedRoom(newRoom);
        bedroom.fitment();//装修成卧室
        RoomDecorator kitchen = new Kitchen(newRoom);
        kitchen.fitment();//装修成厨房
    }
}
